package queue

import (
	"errors"
	"fmt"
)

/**
ArrayQueue 数组队列
有一个问题:
数组实现顺序队列，就是随着队列元素的插入和删除，队尾指针和队头指针不断后移，
从而导致队尾指针指向末尾无法继续插入数据，这时候队列头部还是有剩余空间的,
数组前半部分的空间不能利用，解决这个问题需要把数组看成一个环状的空间（循环队列）
*/
type ArrayQueue struct {
	maxSize int
	array   [5]int //数组--》模拟队列
	front   int    //表示指向队列首部
	rear    int    //表示指向队列的尾部
}

func NewArrayQueue(num int) *ArrayQueue {
	return &ArrayQueue{
		maxSize: num,
		front:   -1,
		rear:    -1,
	}
}

//添加数据到队列
func (this *ArrayQueue) Enqueue(val int) (err error) {
	//先判断队列是否已满
	if this.rear == this.maxSize-1 { //重要重要：rear是队列尾部含队尾，
		return errors.New("queue full")
	}
	this.rear++ //rear 后移
	this.array[this.rear] = val
	return
}

//从队列中取出数据
func (this *ArrayQueue) Dequeue() (val int, err error) {
	//先判断队列是否为空
	if this.rear == this.front { //队列为空
		return -1, errors.New("队列为空")
	}
	this.front++ //front指向队首前面一个，不含队首
	val = this.array[this.front]
	return val, err
}

//显示队列，找到队首，然后遍历到队尾
func (this *ArrayQueue) ListQueue() {
	fmt.Println("队列当前的情况是")
	//front指向队首前面一个，不含队首
	for i := this.front + 1; i <= this.rear; i++ {
		fmt.Printf("array[%d]=%d\t", i, this.array[i])
	}
	fmt.Println()
}
